#include "zero.h"

int CBasicPad::Pad(BYTE* pData, int& iLen)
{
    while(iLen % m_iBlockSize != 0) // 若数据长度不是块大小的整数倍，则继续填充
    {
        pData[iLen] = 0;
        iLen++;
    }

    return 0;
}

int CBasicPad::Pad(STD_BUFFER& bufData)
{
    int iLen = bufData.size();

    bufData.resize(bufData.size() + m_iBlockSize); // 扩展缓冲区以容纳填充字节

    int r = Pad(bufData.data(), iLen);
    if(r < 0) return r;

    bufData.resize(iLen);
    return 0;
}

int CBasicPad::UnPad(STD_BUFFER& bufData)
{
    int iLen = bufData.size();

    int r = UnPad(bufData.data(), iLen);
    if(r < 0) return r;

    bufData.resize(iLen);
    return 0;
}

int CZeroPad::Pad(BYTE* pData, int& iLen)
{
    if(pData == NULL || iLen <= 0) return -1;

    // 计算填充长度，确保填充后总长度为m_iBlockSize的倍数
    int paddingLength = m_iBlockSize - (iLen % m_iBlockSize);
    if(paddingLength == 0) // 若已满足分组长度要求，则额外增加一个全零分组
        paddingLength = m_iBlockSize;

    for(int i = 0; i < paddingLength; ++i) pData[iLen + i] = 0x00; // 在原始数据末尾添加填充字节（此处为零）

    iLen += paddingLength; // 更新数据的实际长度以包含所有填充字节

    return 0;
}

int CZeroPad::UnPad(BYTE* pData, int& iLen)
{
    if(pData == NULL || iLen <= 0) return -1;

    // 从尾部开始查找第一个非零字节的位置来确定填充的长度
    while(iLen > 0 && pData[iLen - 1] == 0x00)
    {
        --iLen; // 移除填充字节，更新数据的实际长度
    }

    return 0;
}
